﻿using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Win32;
using Excel = Microsoft.Office.Interop.Excel;
using VRA.Dto;
using Vra.DataAccess;
using VRA.BusinessLayer;

namespace ViewRidgeAssistant
{
    /// <summary>
    /// Логика взаимодействия для AppMainWindow.xaml
    /// </summary>
    public partial class AppMainWindow : Window
    {
        private string status; // устанавливает с какой таблицей в текущий момент работает юзер

        public AppMainWindow()
        {
            InitializeComponent();
        }

       

#region TablesButtonClick
        private void btCustomer_Click(object sender, RoutedEventArgs e)
        {
            switch (status)
            {
               
                case "Artist": this.dgArtists.Visibility = Visibility.Hidden; 
                break;

                case "Work": this.dgWork.Visibility = Visibility.Hidden; 
                break;

                case "Trans": this.dgTrans.Visibility = Visibility.Hidden; this.btnEdit.IsEnabled = true;
                break;

                case "Interests": this.dgInterests.Visibility = Visibility.Hidden; this.btnAdd.IsEnabled = true; this.btnDelete.IsEnabled = true; this.btnEdit.IsEnabled = true;
                break;
                case "Nations": this.dgNations.Visibility = Visibility.Hidden;
                break;

              }
            
            this.dgCustomer.Visibility = Visibility.Visible;
            this.statusLabel.Visibility = Visibility.Visible;
            this.statusLabel.Content = " Таблица Клиенты";
            status = "Customer";
            this.btnSearch.IsEnabled = true;
            this.btnAdd.IsEnabled = true;
            this.btnEdit.IsEnabled = true;
            this.btnDelete.IsEnabled = true;
            this.btnRefresh_Click(sender, e);
        }

        private void btArtists_Click(object sender, RoutedEventArgs e)
        {
            switch (status)
            {

                case "Customer": this.dgCustomer.Visibility = Visibility.Hidden;
                    break;

                case "Work": this.dgWork.Visibility = Visibility.Hidden;
                    break;

                case "Trans": this.dgTrans.Visibility = Visibility.Hidden; this.btnEdit.IsEnabled = true;
                    break;
                case "Interests": this.dgInterests.Visibility = Visibility.Hidden; this.btnAdd.IsEnabled = true; this.btnDelete.IsEnabled = true; this.btnEdit.IsEnabled = true;
                    break;
                case "Nations": this.dgNations.Visibility = Visibility.Hidden;
                    break;
               
            }
            this.dgArtists.Visibility = Visibility.Visible;
            status = "Artist";
            this.btnRefresh_Click(sender, e);
            this.statusLabel.Visibility = Visibility.Visible;
            this.statusLabel.Content = " Таблица Художники";
            this.btnSearch.IsEnabled = true;
            this.btnAdd.IsEnabled = true;
            this.btnEdit.IsEnabled = true;
            this.btnDelete.IsEnabled = true;
        }

        private void btWork_Click(object sender, RoutedEventArgs e)
        {
            switch (status)
            {

                case "Artist": this.dgArtists.Visibility = Visibility.Hidden;
                    break;

                case "Customer": this.dgCustomer.Visibility = Visibility.Hidden;
                    break;

                case "Trans": this.dgTrans.Visibility = Visibility.Hidden; this.btnEdit.IsEnabled = true;
                    break;
                case "Interests": this.dgInterests.Visibility = Visibility.Hidden; this.btnAdd.IsEnabled = true; this.btnDelete.IsEnabled = true; this.btnEdit.IsEnabled = true;
                    break;
                case "Nations": this.dgNations.Visibility = Visibility.Hidden;
                    break;
                
            }
            this.dgWork.Visibility = Visibility.Visible;
            status = "Work";
            this.statusLabel.Visibility = Visibility.Visible;
            this.statusLabel.Content = "Таблица Работы";
            this.btnRefresh_Click(sender, e);
            this.btnSearch.IsEnabled = true;
            this.btnAdd.IsEnabled = true;
            this.btnEdit.IsEnabled = true;
            this.btnDelete.IsEnabled = true;
        }

        private void btTrans_Click(object sender, RoutedEventArgs e)
        {
            switch (status)
            {

                case "Artist": this.dgArtists.Visibility = Visibility.Hidden;
                    break;

                case "Customer": this.dgCustomer.Visibility = Visibility.Hidden;
                    break;

                case "Work": this.dgWork.Visibility = Visibility.Hidden;
                    break;

                case "Interests": this.dgInterests.Visibility = Visibility.Hidden; this.btnAdd.IsEnabled = true; this.btnDelete.IsEnabled = true; this.btnEdit.IsEnabled = true;
                    break;
                case "Nations": this.dgNations.Visibility = Visibility.Hidden;
                    break;
            }
            this.btnEdit.IsEnabled = false;
            this.dgTrans.Visibility = Visibility.Visible;
            status = "Trans";
            this.btnRefresh_Click(sender, e);
            this.statusLabel.Visibility = Visibility.Visible;
            this.statusLabel.Content = "Таблица Транзакции";
            this.btnSearch.IsEnabled = true;
            this.btnAdd.IsEnabled = true;
            this.btnEdit.IsEnabled = true;
            this.btnDelete.IsEnabled = true;

        }

        private void btInterests_Click(object sender, RoutedEventArgs e)
        {
            switch (status)
            {

                case "Artist": this.dgArtists.Visibility = Visibility.Hidden;
                    break;

                case "Customer": this.dgCustomer.Visibility = Visibility.Hidden;
                    break;

                case "Work": this.dgWork.Visibility = Visibility.Hidden;
                    break;

                case "Trans": this.dgTrans.Visibility = Visibility.Hidden;
                    break;
                case "Nations": this.dgNations.Visibility = Visibility.Hidden;
                    break;
            }

            this.dgInterests.Visibility = Visibility.Visible;
            status = "Interests";
            this.btnRefresh_Click(sender, e);
            this.btnAdd.IsEnabled = true;
            this.btnDelete.IsEnabled = true;
            this.btnEdit.IsEnabled = false;
            this.statusLabel.Visibility = Visibility.Visible;
            this.statusLabel.Content = " Представление интересы клиентов";
        }


        private void btNations_Click(object sender, RoutedEventArgs e)
        {
            switch (status)
            {

                case "Artist": this.dgArtists.Visibility = Visibility.Hidden;
                    break;

                case "Customer": this.dgCustomer.Visibility = Visibility.Hidden;
                    break;

                case "Work": this.dgWork.Visibility = Visibility.Hidden;
                    break;

                case "Trans": this.dgTrans.Visibility = Visibility.Hidden;
                    break;

                case "Interests": this.dgInterests.Visibility = Visibility.Hidden;
                    break;
                    
            }

            this.dgNations.Visibility = Visibility.Visible;
            status = "Nations";
            this.btnRefresh_Click(sender, e);
            this.btnAdd.IsEnabled = true;
            this.btnDelete.IsEnabled = true;
            this.btnEdit.IsEnabled = false;
            this.btnSearch.IsEnabled = false;
            this.statusLabel.Visibility = Visibility.Visible;
            this.statusLabel.Content = " Список допустимых национальностей";
       
        }


 #endregion;

#region ActionButtonsClick
        private void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            switch (status)
            {
                case "Artist": this.btnAddA_Click();
                    break;

                case "Work": this.btnAddW_Click();
                    break;

                case "Trans": this.btnAddT_Click();
                    break;

                case "Customer": this.btnAddC_Click();
                    break;

                case "Nations": this.btnAddN_Click();
                    break;

                case "Interests": this.btnAddI_Click();
                    break;

                default: MessageBox.Show("Необходимо выбрать таблицу, в которую добавляется элемент!"); return;
            }
        }

        private void btnAddI_Click()
        {
            AddInterestWindow window = new AddInterestWindow();
            window.ShowDialog();
            this.dgInterests.ItemsSource = ProcessFactory.GetInterestsProcess().GetList();
        }

    

        private void btnEdit_Click(object sender, RoutedEventArgs e)
        {
            switch (status)
            {
                case "Artist": this.btnEditA_Click();
                    break;

                case "Work": this.btnEditW_Click();
                    break;

                case "Trans": this.btnEditT_Click();
                    break;

                case "Customer": this.btnEditC_Click();
                    break;


                default: MessageBox.Show("Необходимо выбрать таблицу  и элемент для редактирования !"); return;
            }
        }

        private void btnDelete_Click(object sender, RoutedEventArgs e)
        {
            switch (status)
            {
                case "Artist": this.btnDeleteA_Click();
                    break;

                case "Work": this.btnDeleteW_Click();
                    break;

                case "Trans": this.btnDeleteT_Click();
                    break;

                case "Customer": this.btnDeleteC_Click();
                    break;

                case "Nations": this.btnDeleteN_Click();
                    break;
              
                case "Interests": this.btnDeleteI_Click();
                    break;


                default: MessageBox.Show("Необходимо выбрать таблицу  и элемент для удаления !"); return;
            }

        }

        private void btnDeleteI_Click()
        {
            InterestsDto item = this.dgInterests.SelectedItem as InterestsDto;

            if (item == null)
            {
                MessageBox.Show("Выберите запись для удаления", "Удаление интереса");
                return;
            }

            MessageBoxResult result = MessageBox.Show("Удалить интерес к художнику " + item.Artist.Name.TrimEnd(' ') + " клиента " + item.Customer.Name.TrimEnd(' ') + "?",
               "Удаление интереса", MessageBoxButton.YesNo, MessageBoxImage.Warning);

            if (result != MessageBoxResult.Yes)
                return;

            ProcessFactory.GetInterestsProcess().Delete(item);

            btnReloadI_Click();
        }

       

        private void btnRefresh_Click(object sender, RoutedEventArgs e)
        {
            switch (status)
            {
                case "Artist": this.btnReloadA_Click();
                    break;

                case "Work": this.btnReloadW_Click();
                    break;

                case "Trans": this.btnReloadT_Click();
                    break;

                case "Customer": this.btnReloadC_Click();
                    break;

                case "Interests": this.btnReloadI_Click(); 
                break;

                case "Nations":
                {
                    this.dgNations.ItemsSource = ProcessFactory.GetNationProcess().GetList();
                }
                break;


                default: MessageBox.Show("Необходимо выбрать таблицу для обновления !"); return;
            }
        }

        private void btnReloadI_Click()
        {
            this.dgInterests.ItemsSource = ProcessFactory.GetInterestsProcess().GetList();
        }


        private void btnSearchClick(object sender, RoutedEventArgs e)
        {
            SearchWindow search = new SearchWindow(status);
            

            {

                switch (status)
                {

                    case "Artist":

                        search.ShowDialog();
                        if (search.exec)
                        {
                            this.dgArtists.Visibility = Visibility.Hidden;
                            this.dgArtists.ItemsSource = search.FindedArtists;
                            this.dgArtists.Visibility = Visibility.Visible;
                        }
                        break;

                    case "Customer":
                        search.ShowDialog();
                        if (search.exec)
                        {
                            this.dgCustomer.Visibility = Visibility.Hidden;
                            this.dgCustomer.ItemsSource = search.FindedCustomers;
                            this.dgCustomer.Visibility = Visibility.Visible;

                        }
                         break;

                    case "Work":
                        search.ShowDialog();
                        if (search.exec)
                        {
                            this.dgWork.Visibility = Visibility.Hidden;
                            this.dgWork.ItemsSource = search.FindedWorks;
                            this.dgWork.Visibility = Visibility.Visible;

                        }
                         break;

                    case "Trans":
                         search.ShowDialog();
                         if (search.exec)
                         {
                             this.dgTrans.Visibility = Visibility.Hidden;
                             this.dgTrans.ItemsSource = search.FindedTransactions;
                             this.dgTrans.Visibility = Visibility.Visible;
                         }
                         break;

                    case "Interests":
                       search.ShowDialog();
                       if (search.exec)
                       {
                           this.dgInterests.Visibility = Visibility.Hidden;
                           this.dgInterests.ItemsSource = search.FindedInterests;
                           this.dgInterests.Visibility = Visibility.Visible;

                       } 
                        break;

                    default: MessageBox.Show("Для поиска необходимо выбрать таблицу!"); break;
                }
            }

        }
        #endregion;

      


#region Artist
        private void btnAddA_Click()
        {
            AddArtistWindow window = new AddArtistWindow();
            window.ShowDialog();

            //Получаем список художников
            IList<ArtistDto> items = ProcessFactory.GetArtistProcess().GetList();
            //Передаем этот список таблице на отображение
            dgArtists.ItemsSource = items;

        }

        private void btnDeleteA_Click()
        {
            //Получаем выделенную строку с объектом художника
            ArtistDto item = dgArtists.SelectedItem as ArtistDto;
            //если там не художник или пользователь ничего не выбрал сообщаем об этом
            if (item == null)
            {
                MessageBox.Show("Выберите запись для удаления", "Удаление художника");
                return;
            }
            //Просим подтвердить удаление
            MessageBoxResult result = MessageBox.Show("Удалить художника " + item.Name + "?",
                       "Удаление художника", MessageBoxButton.YesNo, MessageBoxImage.Warning);
            //Если пользователь не подтвердил, выходим
            if (result != MessageBoxResult.Yes)
                return;
            //Если все проверки пройдены и подтверждение получено, удаляем художника
            ProcessFactory.GetArtistProcess().Delete(item.Id);
            //И перезагружаем список художников
            btnReloadA_Click();

        }

        private void btnReloadA_Click()
        {
            //Получаем список художников и передаем его на отображение таблице
            dgArtists.ItemsSource = ProcessFactory.GetArtistProcess().GetList();


        }

        private void btnEditA_Click()
        {
            //Получаем выделенную строку с объектом художника
            ArtistDto item = dgArtists.SelectedItem as ArtistDto;
            //если там не художник или пользователь ничего не выбрал сообщаем об этом
            if (item == null)
            {
                MessageBox.Show("Выберите запись для редактирования", "Редактирование");
                return;
            }

            //Создаём окно
            AddArtistWindow window = new AddArtistWindow();
            //Передаём объект на редактирование
            window.Load(item);
            //Отображаем окно с данными
            window.ShowDialog();
            //Перезагружаем список объектов
            btnReloadA_Click();


        }

        #endregion

#region Customer

        private void btnAddC_Click()
        {
            AddCustomerWindow window = new AddCustomerWindow();
            window.ShowDialog();
            dgCustomer.ItemsSource = ProcessFactory.GetCustomerProcess().GetList();
        }

        private void btnEditC_Click()
        {
            CustomerDto item = dgCustomer.SelectedItem as CustomerDto;

            if (item == null)
            {
                MessageBox.Show("Выберите запись для редактирования", "Редактирование клиента");
                return;
            }

            //Создаём окно
            AddCustomerWindow window = new AddCustomerWindow();
            //Передаём объект на редактирование
            window.Load(item);
            //Отображаем окно с данными
            window.ShowDialog();
            //Перезагружаем список объектов

            btnReloadC_Click();


        }

        private void btnReloadC_Click()
        {
            dgCustomer.ItemsSource = ProcessFactory.GetCustomerProcess().GetList();
        }

        private void btnDeleteC_Click()
        {

            CustomerDto item = dgCustomer.SelectedItem as CustomerDto;

            if (item == null)
            {
                MessageBox.Show("Выберите запись для удаления", "Удаление клиента");
                return;
            }

            MessageBoxResult result = MessageBox.Show("Удалить клиента " + item.Name + "?",
               "Удаление клиента", MessageBoxButton.YesNo, MessageBoxImage.Warning);

            //Если пользователь не подтвердил, выходим
            if (result != MessageBoxResult.Yes)
                return;


            ProcessFactory.GetCustomerProcess().Delete(item.Id);

            btnReloadC_Click();



        }
        #endregion;

#region Work
        private void btnAddW_Click()
        {
            AddWorkWindow window = new AddWorkWindow();
            window.ShowDialog();

            dgWork.ItemsSource = ProcessFactory.GetWorkProcess().GetList();
        }

        private void btnEditW_Click()
        {
            WorkDto item = dgWork.SelectedItem as WorkDto;

            if (item == null)
            {
                MessageBox.Show("Выберите запись для редактирования", "Редактирование");
                return;
            }

            AddWorkWindow window = new AddWorkWindow();
            window.Load(item);
            window.ShowDialog();
            btnReloadW_Click();


        }

        private void btnReloadW_Click()
        {
            dgWork.ItemsSource = ProcessFactory.GetWorkProcess().GetList();
        }

        private void btnDeleteW_Click()
        {
            //Получаем выделенную строку с объектом 
            WorkDto item = dgWork.SelectedItem as WorkDto;

            if (item == null)
            {
                MessageBox.Show("Выберите запись для удаления", "Удаление картины");
                return;
            }

            //Просим подтвердить удаление
            MessageBoxResult result = MessageBox.Show("Удалить картину " + item.Title + "?",
                       "Удаление картины", MessageBoxButton.YesNo, MessageBoxImage.Warning);
            //Если пользователь не подтвердил, выходим
            if (result != MessageBoxResult.Yes)
                return;

            //Если все проверки пройдены и подтверждение получено, удаляем
            ProcessFactory.GetWorkProcess().Delete(item.Id);

            btnReloadW_Click();

        }

        #endregion;

#region Transaction
        private void btnAddT_Click()
        {
           // AddTransactionWindow window = new AddTransactionWindow();
            TransChooseWindow window = new TransChooseWindow();
            window.ShowDialog();
            dgTrans.ItemsSource = ProcessFactory.GetTransactionProcess().GetList();
        }

        private void btnEditT_Click()
        {
            TransactionDto item = this.dgTrans.SelectedItem as TransactionDto;

            if (item == null)
            {
                MessageBox.Show("Выберите запись для редактирования", "Изменение транзакции");
                return;
            }

            AddTransactionWindow window = new AddTransactionWindow();
            window.Load(item);
            window.ShowDialog();
            btnReloadT_Click();

        }

        private void btnReloadT_Click()
        {
            dgTrans.ItemsSource = ProcessFactory.GetTransactionProcess().GetList();
        }

       
        private void btnDeleteT_Click()
        {
            TransactionDto item = this.dgTrans.SelectedItem as TransactionDto;

            if (item == null)
            {
                MessageBox.Show("Выберите запись для удаления", "Удаление транзакции");
                return;
            }

            MessageBoxResult result = MessageBox.Show("Удалить Транзакцию " + item.TransactionID + "?",
               "Удаление транзакции", MessageBoxButton.YesNo, MessageBoxImage.Warning);

            if (result != MessageBoxResult.Yes)
                return;

            ProcessFactory.GetTransactionProcess().Delete(item.TransactionID);

            btnReloadT_Click();

        }
        #endregion;


        private void btnAddN_Click()
        {
            AddNationWindow window = new AddNationWindow();
            window.ShowDialog();
            this.btnReloadN_Click();
        }
        private void btnReloadN_Click()
        {
            dgNations.ItemsSource = ProcessFactory.GetNationProcess().GetList();
        }

        private void btnDeleteN_Click()
        {
            NationDto item = this.dgNations.SelectedItem as NationDto;

            if (item == null)
            {
                MessageBox.Show("Выберите запись для удаления", "Удаление нации");
                return;
            }

            MessageBoxResult result = MessageBox.Show("Удалить национальность " + item.Nationality + "?",
               "Удаление национальности", MessageBoxButton.YesNo, MessageBoxImage.Warning);

            if (result != MessageBoxResult.Yes)
                return;

            ProcessFactory.GetNationProcess().Delete(item.Id);

            btnReloadN_Click();
        }

#region Menu
        private void Database_Click(object sender, RoutedEventArgs e)
        {
            SettingsWindow window = new SettingsWindow();
            window.ShowDialog();
        }

        private void Path_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog settingsDialog = new OpenFileDialog();
            settingsDialog.Filter = "Файлы базы данных(*.mdf)|*.mdf";
            settingsDialog.CheckFileExists = true;
            settingsDialog.Multiselect = false;

            if (settingsDialog.ShowDialog() == true)
            {
                SettingsDao _settings = DaoFactory.GetSettingsDao();
                _settings.SetSettings(settingsDialog.FileName);
            }
        }
        #endregion

        private void HtmlExporterButton_Click(object sender, RoutedEventArgs e)
        {
            String rep = "";

            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
            dlg.DefaultExt = ".vrt";
            dlg.Filter = "View Ridge Assistant Template files|*.vrt";

            Nullable<bool> result = dlg.ShowDialog();

            if (result == true)
            {
                System.IO.StreamReader sr = new System.IO.StreamReader(dlg.FileName);
                rep = sr.ReadToEnd();
                sr.Close();
            }
            else
            {
                return;
            }

            dlg = null;

            List<object> grid = null;

            switch (status)
            {
                case "Customer":
                    grid = this.dgCustomer.ItemsSource.Cast<object>().ToList();
                    break;

                case "Artist":
                    grid = this.dgArtists.ItemsSource.Cast<object>().ToList();
                    break;

                case "Work":
                    grid = this.dgWork.ItemsSource.Cast<object>().ToList();
                    break;

                case "Trans":
                    grid = this.dgTrans.ItemsSource.Cast<object>().ToList();
                    break;

                case "Interests":
                    grid = this.dgInterests.ItemsSource.Cast<object>().ToList();
                    break;
            }

            //String full_rep = this.fillHtmlTableByType(grid, rep, status);

            string full_rep = ProcessFactory.GetReport().fillHtmlTableByType(grid, rep, status);

            Microsoft.Win32.SaveFileDialog sdlg = new Microsoft.Win32.SaveFileDialog();
            sdlg.DefaultExt = ".html";
            sdlg.Filter = "Html Ducoments (.html)|*.html";
            if (sdlg.ShowDialog() == true)
            {
                string filename = sdlg.FileName;
                StreamWriter sw = new StreamWriter(filename);
                sw.WriteLine(full_rep);
                sw.Close();

            }

            sdlg = null;

        }

        private void ExelExporterButton_Click(object sender, RoutedEventArgs e)
        {
           

            List<object> grid = null;

            switch (status)
            {
                case "Customer":
                    grid = this.dgCustomer.ItemsSource.Cast<object>().ToList();
                    break;

                case "Artist":
                    grid = this.dgArtists.ItemsSource.Cast<object>().ToList();
                    break;

                case "Work":
                    grid = this.dgWork.ItemsSource.Cast<object>().ToList();
                    break;

                case "Trans":
                    grid = this.dgTrans.ItemsSource.Cast<object>().ToList();
                    break;

                case "Interests":
                    grid = this.dgInterests.ItemsSource.Cast<object>().ToList();
                    break;
            }

//            this.fillExcelTableByType(grid, ExcelWorkSheet, status);
            ProcessFactory.GetReport().fillExcelTableByType(grid, status);
            

        }

        private void HtmlWorksInGalleryButton_Click(object sender, RoutedEventArgs e) 
        {
            String rep = "";

            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
            dlg.DefaultExt = ".vrt";
            dlg.Filter = "View Ridge Assistant Template files|*.vrt";

            Nullable<bool> result = dlg.ShowDialog();

            if (result == true)
            {
                System.IO.StreamReader sr = new System.IO.StreamReader(dlg.FileName);
                rep = sr.ReadToEnd();
                sr.Close();
            }
            else
            {
                return;
            }

            dlg = null;

            string full_rep = ProcessFactory.GetReport().genHtmlWorksInGallery(rep) ;

            Microsoft.Win32.SaveFileDialog sdlg = new Microsoft.Win32.SaveFileDialog();
            sdlg.DefaultExt = ".html";
            sdlg.Filter = "Html Ducoments (.html)|*.html";
            if (sdlg.ShowDialog() == true)
            {
                string filename = sdlg.FileName;
                StreamWriter sw = new StreamWriter(filename);
                sw.WriteLine(full_rep);
                sw.Close();

            }

            sdlg = null;
        }

        private String fillHtmlTableByType(List<object> grid, String html, String status)
        {
            String table = "";

            switch (status)
            {
                case "Customer":

                    /* Пример с перебором Properties объекта. Данный пример демонстрирует, как можно
                     * перебирая объявленные в данном классе property, записывать их в Excel. 
                     * При этом, последовательность полей соответствует последовательности их
                     * объявления в соответствующем используемом классе - в данном случае CustomerDto.
                     * Данный вариант удобен автоматическим добавлением новых / удалением полей в итоговой таблице 
                     * при изменении целевого класса. */

                    /* TODO: Нет перевода имен полей */

                    CustomerDto cdto = new CustomerDto(); // пустой объект для получения списка property

                    table += "<tr>";
                    // генерация шапки таблицы
                    foreach (var prop in cdto.GetType().GetProperties())
                    {
                        table += "<td><b>" + prop.Name.Trim() + "</b></td>";
                    }
                    table += "</tr>";

                    // генерация строк-записей таблицы
                    foreach (var item in grid)
                    {
 
                        CustomerDto CustomerItem = (CustomerDto)item;

                        table += "<tr>";
                        String val = "";
                        foreach (var prop in CustomerItem.GetType().GetProperties())
                        {
                            object t = prop.GetValue(CustomerItem, null);
                            val = (t == null) ? "" : t.ToString();
                            table += "<td>" + val.Trim() +"</td>";
                        }
                        table += "</tr>";

                    }
                    break;

                case "Artist":

                    /* Пример с ручным перебором доступных полей. */

                    // шапка таблицы
                    table += "<tr><td><b>Имя</b></td><td><b>Год рождения</b></td><td><b>Год смерти</b></td><td><b>Национальность</b></td></tr>";

                    // содержимое таблицы
                    foreach (var item in grid)
                    {
                        ArtistDto ArtistItem = (ArtistDto)item;
                        table += "<tr>";
                        table += "<td>" + ArtistItem.Name.Trim() + "</td>";
                        table += "<td>" + ArtistItem.BirthYear.ToString().Trim() + "</td>";
                        table += "<td>" + ArtistItem.DeceaseYear.ToString().Trim() + "</td>";
                        table += "<td>" + ArtistItem.Nation.Nationality.Trim() + "</td>";
                        table += "</tr>";
                    }

                    break;

                case "Work":

                    break;

                case "Trans":

                    break;

                case "Interests":

                    break;
            }

            html = html.Replace("[VRA_TABLE_REPORT]", table);

            return html;

        }

    /*    private void fillExcelTableByType(List<object> grid, Excel.Worksheet excel, String status)
        {

            int x = 1;
            int y = 1;

            // первая строка (шапка таблицы) -- жирным стилем
            excel.Cells[y, 1].EntireRow.Font.Bold = true;

            // вырванивание ткста в ячейках -- по левому краю
            excel.Cells.HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft;

            // формат ячеек -- текстовой
            excel.Cells.NumberFormat = "@";

            switch (status)
            {
                case "Customer": 
                
                    /* Пример с перебором Properties объекта. Данный пример демонстрирует, как можно
                     * перебирая объявленные в данном классе property, записывать их в Excel. 
                     * При этом, последовательность полей соответствует последовательности их
                     * объявления в соответствующем используемом классе - в данном случае CustomerDto.
                     * Данный вариант удобен автоматическим добавлением новых / удалением полей в итоговой таблице 
                     * при изменении целевого класса. */

                    /* TODO: Нет перевода имен полей */
        /*
                    CustomerDto cdto = new CustomerDto(); // пустой объект для получения списка property

                    // генерация шапки таблицы
                    foreach (var prop in cdto.GetType().GetProperties())
                    {
                        x++;
                        excel.Cells[y, x] = prop.Name.Trim();
                    }

                    // генерация строк-записей таблицы
                    foreach (var item in grid)
                    {
                        y++;
                        CustomerDto CustomerItem = (CustomerDto)item;

                        x = 1;
                        String val = "";
                        foreach (var prop in CustomerItem.GetType().GetProperties())
                        { 
                            x++;
                            object t = prop.GetValue(CustomerItem, null);
                            val = (t == null) ? "" : t.ToString();
                            excel.Cells[y, x] = val.Trim();
                        }

                    }
                    break;
                     
                case "Artist": 

                    /* Пример с ручным перебором доступных полей. */

                    // шапка таблицы
        /*
                    excel.Cells[y, 1] = "Имя";
                    excel.Cells[y, 2] = "Год рождения";
                    excel.Cells[y, 3] = "Год смерти";
                    excel.Cells[y, 4] = "Национальность";

                    // содержимое таблицы
                    foreach (var item in grid)
                    {
                        ArtistDto ArtistItem = (ArtistDto)item;
                        y++;
                        excel.Cells[y, 1] = ArtistItem.Name.Trim();
                        excel.Cells[y, 2] = ArtistItem.BirthYear.ToString().Trim();
                        excel.Cells[y, 3] = ArtistItem.DeceaseYear.ToString().Trim();
                        excel.Cells[y, 4] = ArtistItem.Nation.Nationality.Trim();
                    }

                    break;

                case "Work":
                    
                    break;

                case "Trans":
                    
                    break;

                case "Interests":
                    
                    break;
            }
         
        }
        */
        private void dgCustomer_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            this.btnEdit_Click(sender, e);
        }

        private void dgWork_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            this.btnEdit_Click(sender, e);
        }

        private void dgArtists_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            this.btnEdit_Click(sender, e);
        }

        private void About_Click(object sender, RoutedEventArgs e)
        {
            about window = new about();
            window.Show();
        }

        private void Image_ImageFailed(object sender, ExceptionRoutedEventArgs e)
        {

        }

        private void Reports_Click(object sender, RoutedEventArgs e)
        {
            
        }

        private void GraphReportButton_Click(object sender, RoutedEventArgs e)
        {
            var window = new ReportWindow();
            window.Show();
        }

     
     

     
      
    }
}
